package com.sakura.conf;/**
 * Created by apple on 2019/3/25.
 */

import com.sakura.model.ColumnInfo;
import com.sakura.model.TableInfo;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @author jixd
 * @Description TODO
 * @Date 2019/3/25 2:58 PM
 * @Version 1.0
 **/
public class TableContext {
    public static Map<String, TableInfo> tables = new HashMap<>();

    static {
        try {
            Connection conn = DBManager.getConn();
            //获取DatabaseMetaData   其中包含了大量的数据库信息
            DatabaseMetaData dbmd = conn.getMetaData();
            /**
             * 获取给定类别中使用的表的描述。
             * 方法原型:ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types);
             * catalog - 表所在的类别名称;""表示获取没有类别的列,null表示获取所有类别的列。
             * schema - 表所在的模式名称(oracle中对应于Tablespace);""表示获取没有模式的列,null标识获取所有模式的列; 可包含单字符通配符("_"),或多字符通配符("%");
             * tableNamePattern - 表名称;可包含单字符通配符("_"),或多字符通配符("%");
             * types - 表类型数组; "TABLE"、"VIEW"、"SYSTEM TABLE"、"GLOBAL TEMPORARY"、"LOCAL TEMPORARY"、"ALIAS" 和 "SYNONYM";null表示包含所有的表类型;可包含单字符通配符("_"),或多字符通配符("%");
             */
            ResultSet tableSet = dbmd.getTables(null,"%", "%", new String []{"TABLE"});
            while(tableSet.next()){
                //get all tables
                String tableName = (String)tableSet.getObject("TABLE_NAME");
                System.out.println("表名："+tableName);
                TableInfo ti = new TableInfo(tableName, new HashMap<String,ColumnInfo>(), new ArrayList<ColumnInfo>());
                tables.put(tableName, ti);

                //get all columns
                ResultSet columnSet = dbmd.getColumns(null, "%", tableName, "%");
                while(columnSet.next()){
                    ColumnInfo columnInfo = new ColumnInfo(columnSet.getString("COLUMN_NAME"),columnSet.getString("TYPE_NAME"), 0);
                    ti.getColumns().put(columnSet.getString("COLUMN_NAME"), columnInfo);
                }

                //get primary keys
                ResultSet primaryKeySet = dbmd.getPrimaryKeys(null, "%", tableName);
                while(primaryKeySet.next()){
                    String primaryKey = primaryKeySet.getString("COLUMN_NAME");
                    System.out.println("primaryKey:"+primaryKey);
                    ti.getColumns().get(primaryKey).setKeyType(1);
                    System.out.println("test:"+ti.getColumns().get(primaryKey).toString());
                    ti.getPrimaryKeyList().add(ti.getColumns().get(primaryKey));
                }

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
